Repository navigation
Redesign the static site: Autumn Budget look, one fact per home, readable layouts - #200
vahid-ahmadi wants to merge 74 commits into
Conversation
…bs, cards on a canvas - style.css: new token layer (brand/neutral scales, semantic roles, chart series roles, type/spacing/elevation, shell geometry) with the legacy aliases repointed onto it; shell sections rewritten in place (sticky header band with icon view tabs, pathway + title band, white sticky sub-tab row for .model-tabs and .economy-subnav, StepPanel, footer); every .band is now a white card on a grey canvas; components appended (card, stat tile, chip, callout tones, expander, on-this-page rail, entry cards, numbered steps, intro card) and the chart house style. - site_nav.py: view-tab icons, brand label, footer row gains Models, Forecasts and Use (still one row, #133), release notes highlight the Forecasts tab, and one STYLE_HREF cache buster (v=8) written into every page and read by economy/topics.py and notes/generate_release_notes.py. - All 110 pages rebuilt with python3 site_nav.py --write. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DESIGN.md is the binding spec for the redesign: content rules, tokens and contrast, the shell, the component classes (including the two-sided StepPanel and where it is required), text budget, chart house style with a class-to-token map for the generators, per-page-type layouts, the homes table for each-fact-once, the flow and cross-link map, the QA checklist and the phase plan. style.css: /connect's hero becomes a title band, paper viewers no longer clear a fixed header, the footer sits at the viewport bottom on short pages, the in-card chart switch on /forecasts scrolls inside itself, release-note provenance lists render as key/value grids, and the last hard-coded sticky offsets read the shell geometry tokens. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reference implementation of DESIGN.md §7.3 for the model tabs. - Overview: one-line verdict callout linking to Validation; the 0.34 multiplier now lives only in the worked example (step 3) and its panel; the step-1 caveat and the step-3 multiplier callout no longer restate it, and the Validation figures (HMRC gap, anchored/free-running MAPE) leave the step-3 panel for a link. Direct shocks move into an expander. - Validation: "On this page" rail; a stat row is now the single home of the four headline MAPEs (the configuration table and the step panels no longer restate them); StepPanel of the three tests; a separate limits card (#caveats, with #multiplier) keeps every limit in full. - Methodology, Code, Paper: tab-specific one-line lede instead of the Overview lede; methodology step 6 links to the worked example instead of restating it. - Every tab ends with a "where next" row (style.css §5.14). - Inline hero-padding blocks and .grain divs removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-next Overview: verdict callout (words only, linking to Validation) above a StepPanel of the join, what it is, and what it can answer; the SVAR sources table moves into an expander, the FRB/US wage-bill figure is stated once. Validation: "On this page" rail, a stat row as the home of the headline numbers (prose, figcaptions and tables now refer to the tiles instead of restating them), a StepPanel of the tests, and the limits card in full. Methodology, Code, Paper: tab-specific one-line lede, where-next row, inline hero padding and .grain removed. style.css: StepPanel body rhythm, in-step tables fit their column at >=900px, row headers read as text, two-up stat tiles on phones. Also drops a restated 4.32% in the OBR free-running expander. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-next us-hank: the verdict keeps "inputs, not results"; Validation tiles hold the solved-parameter score, the vphi miss and goods-market clearing, with steps for the solved parameters and for what is and is not gated. olg: Overview steps carry the two-way join, the model, and the worked reform (the generated olg-stats table is moved unchanged); Validation puts the calibration targets, the WP22 benchmark and the OBR OLG comparison (seven dimensions as expanders, ids kept) in one StepPanel. Sub-pages: one-line ledes, where-next rows, inline hero padding and .grain removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pe: Overview follows the §7.3 order (joins, what it is, what it can answer); the generated pe-costing chart moves unchanged into step 3. Validation tiles hold the HMRC gap and the scope counts. define: the pe-bridge section moves below the sub-tab row as step 1; the baseline-vs-outturn and multiplier figures leave the Overview for links to their Validation homes; Validation gets tiles, a StepPanel of gates, calibration, multiplier and emissions, and the ceiling as its limits card. The methodology tab links to the multiplier instead of restating it. Sub-pages: one-line ledes, where-next rows, inline hero padding and .grain removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Models: each row's facts state the verdict in words and link to the model's Validation tab; the validation figures (MAPEs, q-value, pyfrbus residual, OG-UK worked example, £50,000 case) are no longer restated here. - Combine (#compose): the three join types as a StepPanel (score a reform, og+microsim, the four incidence joins); #score keeps its id. - Validation: "By model" table now carries a verdict column in words; "Vs other institutions" names the comparison and how comparable it is, and links to the tab that holds the figures. The two external errors that lived only here (BoE MPR Aug 2024 CPI episode, OBR FER GDP bias) move to /svar/validation#forecasters, which used to point back here. - Where-next row; style.css §5.16 stacks the model chip under the question below 620px instead of squeezing it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- "Three ways in": Autumn-Budget-style entry cards (icon badge,
"Explore →") for Models, Forecasts and Use, compact rows on phones.
- Verdicts: each grade names its model in words and links to the
Validation tab; no multiplier figures restated. The scored period
keeps its subject and verdict sentence and links to /forecasts#scored
instead of restating the forecast, band and outturn.
- How the models connect (#joins kept): one StepPanel step per join; the
panel shows the pipeline and its entry point; the OBR join result links
to the worked example on /obr instead of restating the ratio.
- Model map evidence lines: verdict in words + "Evidence →" to each
Validation tab; no MAPEs, FEVD shares, residuals or OG-UK results.
- Hero h1: the two spans run inline so text-wrap: balance sets the
breaks. Hero fan region untouched (assets/make_hero.py --check passes).
- Ordinal eyebrows ("01 —") dropped from new copy per DESIGN.md §4.1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
/connect: one StepPanel, a step per route (#connect, #cli, #code keep their ids so the sub-tabs still land); the panel shows the endpoint, the install and the commands for the route in view. Lede trimmed to the §5 budget; the "some clients gate custom connectors by plan" caveat moves to the access note rather than being dropped. Python pane titles become h4 under the step heading. Legacy colour aliases in the page CSS replaced with role tokens; the inline hero padding rule and .grain go. /contact: the email is the one primary button, serif card title, lower-case eyebrows (CSS uppercases them), the X link names its target. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The div is display: none since phase 1 (DESIGN.md §9). Removed from the forecasts hubs, the two economy hubs and the CPI note; each sits outside the generated regions, and every generator's --check still passes. The topic pages and release notes keep theirs until phase 3, because economy/topics.py and notes/generate_release_notes.py emit it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Phase 1 added Models, Forecasts and Use to the one-row footer. Vahid removed the footer directory himself in #133 and kept only PolicyEngine, GitHub and Contact; the views are the header tabs' job. FOOTER_LINKS reverted (the phase-1 footer styling stays), every page re-rendered with python3 site_nav.py --write, and DESIGN.md §3.5 reconciled to that decision. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…anel The olg Code tab's sticky panel is aria-hidden, so its six script links take tabindex="-1" (the same links stay reachable in the step bodies). The homepage score column closes the gap the removed rail left. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…iagrams One /stepper.js replaces the four inline StepPanel/rail script variants on 31 pages: per .scrolly-wrap, panels chosen by data-step with the nearest earlier panel pinned, hashchange and in-card tab clicks re-run it. site_nav.py now writes the model sub-tab rows from a SUBTABS table, adds the stepper tag where a page has a StepPanel or rail, and fails on an inline copy. The methodology diagram SVGs use role tokens instead of --accent/--text-light. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chartkit.py lifts every <text> a generator writes into a percent-positioned HTML span, so tick and value labels keep 12 px at any width (they rendered at 4-7 px on a phone and in StepPanel columns). The plot stretches to a usable height on a phone with non-scaling strokes and round-capped path dots; y labels sit inside the plot above their gridline, first/last x ticks align to the edges, legends and in-chart notes are HTML, zero lines are vc-zero, inline fills/strokes are classes. Applied in make_charts.py, score.py, make_open_fans.py, make_hero.py (value ticks moved to a right gutter, off the median), make_current_outlooks.py and economy/build.py; the OG-UK showcase draws at its container's pixel width. hank-targets is an HTML table now; the obr-outturn values move to a small table below 520 px. The computed-share grade 'poor' reads 'fit badly' (same counts). No plotted number changed. STYLE_VERSION 9; DESIGN.md §6.3 documents the approach. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The generator template now follows DESIGN.md §7.7: title band without the value, a single stat tile (observation and change on the prior one) linking to the series' topic page, the provenance list with publisher and snapshot chips, and a where-next row (topic page, data store, forecast record). No .grain, no hard-coded nav, no ordinal eyebrows. --rebuild rewrites every committed note from its own snapshot, and --check now also fails on a note that no longer matches the template, so the 53 pages cannot drift. site_nav.where_next() is the shared row. The hand-written CPI note gets the same where-next row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ch fact once /forecasts, /forecasts/us, /economy and /economy/us get an "On this page" rail and a where-next row; eyebrows lose their ordinals and the title bands their reveal hooks; the /forecasts lede is cut to the record's rule. The record counts are a stat row from forecasts/score.py (the home of those numbers; the duplicate 'next due' line is folded into the tile). Topic pages (economy/topics.py): readings are stat tiles, the lede names the series instead of restating them, the model prose points at the forecast table rather than quoting its first row, the validation callout keeps the verdict in words and links to the figures, and every page ends with where next. The hub topic lists show each topic's question, not its reading, and the trend note no longer restates the CPI print. No .grain. The /forecasts 375 px overflow was the as-of recipe that data/build_page.py emitted outside a code block; it is a .codeblock now. The coverage limit links to its numbers on /svar/validation instead of restating them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chartkit.tick_plan picks about seven quarter labels on a wide fan and three on a narrow one, so the 13-quarter CPI and the unemployment fans on /forecasts no longer stack labels. site_nav.render() takes an optional source, so generate_release_notes.py --check renders each note from its template without writing to the committed page. The OG-UK runtime chart sizes its viewBox to the content box (labels now exactly 12 px), the hank-targets miss uses a true minus sign, and an unused literal-colour rule is gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nav-h header contract The phase-2 tab lede dropped the current-vintage phrase the site contract asks for; it is back in the lede (one sentence, within the §5 limit). The 112px assertion pinned the two-row mobile header from #70. The redesign replaced it with a single --nav-h band whose view tabs scroll inside themselves (DESIGN.md §2.4, §3.1), so the literal no longer applies. The test now checks the same intent against the new shell: the header height and every sticky offset read --nav-h, the tab row contains its own overflow, and none of the old hard-coded 112/129/172px offsets survive. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…esting /forecasts#limits called Bank Rate 'the only robust win'. The boe-svar evaluation (papers/boe-svar/figures/rolling_evaluation.json) says otherwise: against the drifting random walk Bank Rate is 0.793 at h=1 with DM p=0.018, but its Benjamini-Hochberg q is 0.362 and none of the 64 variable x horizon tests clears q<0.10 (min q 0.362; production spec 0.401). The sentence now matches that and links to its home on /svar/validation#forecasters without restating the figures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, short ledes - reveal.js labels each cell of a word-heavy table from its column head and marks it .t-stack; below 640px each row becomes a card instead of a 720px side-scroll. Numeric grids and long registers (>20 rows) keep the scroller. data-stack=yes/no overrides; without JS every table scrolls. - Sub-tab rows, table scrollers and method diagrams fade on the edge that hides content; the chosen sub-tab is scrolled into view on load. Model tab rows fit at 375px (8px tab padding under 400px). - The hand-drawn methodology diagrams on all seven models rendered labels at ~5px on a phone (§1.8). Their 10px text is now 11px and below 640px the diagram keeps its 580px width and scrolls inside its figure. - /forecasts#run: one-line lead; the two engine paragraphs move into an About expander (generator: economy/topics.py), unchanged. - Ledes cut to the §5 limit on /economy, /economy/us, /forecasts/us and the DEFINE-UK replication report (every caveat kept). The /economy/us forecast note moves from the title band into an intro card under the sub-tabs. Topic ledes keep proper nouns (Bank Rate, UK, CPI) instead of lower-casing them. The topics cards on both hubs lead with one sentence. - /models and /connect mark their first sub-tab before the first section is reached; /notes/releases gains its where-next row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…N.md §4.12) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Checked every methodology diagram at 1440 after the 10 to 11px bump. - define: the multiplier diagram is 640 units wide so its two bar labels no longer run off the edge (they clipped before the bump too); the clean-room footnote is reworded to fit (same facts, same numbers). - svar: the outputs box is wider; '+ 2 unidentified (residual volatility)' wraps to two lines; the zero-restriction line is shortened to fit. - obr, frb-us: the 'converged' arrow label between two boxes is now 'done'. - On phones a diagram uses its own width attribute, not a fixed 580px. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…epeated tabs Overview gains a model card sourced from capabilities.py (pinned by a new site-contract test). Methodology drops the panel-less fourth step that restated the Overview join. Validation swaps two padding tiles for the executable check and names the test behind it. Code drops the 'what it can answer' table that duplicated the Overview, adds the missing step-1 panel with runnable CLI commands and a reproduce step. Paper landing states the claim in words and links the numbers instead of restating them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… becomes a router - Header views: Home, Forecasts, Models, Use (site_nav.DESTINATIONS); shell rewritten on all 110 pages with site_nav.py --write. - Paper and replication-report crumbs run through their model (Home / Models / OBR emulator / Paper). - Home: reader router replaces "Three ways in"; one trust card with all seven verdicts in words (the duplicate verdict list under the map is gone); a dedicated forecast-record card (method steps, the scored period in words, links to /forecasts, no restated counts); phone question list under the map; joins shrunk to pipeline strips linking /models#compose (the StepPanel restated it line for line); dead glance-tab script removed. - /models: "Which model" router framing, no-model-answers callout and recommend_model; Compare moved before Combine and unclamped (it showed one row); comparison heads no longer break mid-word, ids at 12 px; a four-entry verification-class glossary (#classes). - DESIGN.md 3.1, 3.2, 3.4, 4.9, 7.1, 7.2 updated to match. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, fold release notes into daily digests - ingest_outturns.py had no unemployment mapping, so the satellite's 2026Q2 outturn (MGSX 4.9, vintage 2026-08-26) sat in data/latest unscored. Mapped, ingested, scored: outside its 90% band, smaller error than no change. Test added so every forecast variable must map to a series. - score.py: scoreboard table is the home of every scored number, with the archived band, the outturn's immutable snapshot link, the no-change baseline and every stored published path (BoE Feb MPR, OBR Mar EFO, BoE SEF Apr) for that quarter. Fixes the 'Inside outside 90% band' label. - Outturn dots on the open-round fans; status tile says when the store was last updated instead of 'lands when the ONS publishes it'. - /forecasts: title is the record, not reform scoring; new 'How we score' card states the six rules and describes the hindsight test as the code runs it (by snapshot date, not release time). Order: record, scoreboard, rules, open rounds, archive, limits, data, platform, notes. - Release notes: 53 per-series pages -> 8 per-date digests with a new-observation / revision / no-change column; Bank Rate printed 3.8%, now the stored 3.75%. Redirect /notes/releases/<date>-<series> -> /notes/releases/<date>#<series> needed (vercel.json, coordinator). - test_site_integrity discovery floor 70 -> 60: the site has 65 pages now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nt home Overview gains a registry-sourced model card; the bridge mechanics and the direct-lever expander now live once (Methodology step 6, Code step 4), and the worked example links the microsimulation's yield instead of restating it. Validation promotes the forecast-vs-outturn backtest to a step of its own (the only test against reality), moves the HMRC comparison of the microsim's costing behind an expander that links its home on /pe/validation, moves the anchored-horizon figures from Methodology into the configuration table, adds the income-tax profile limit from the paper, and drops a clause that attributed superseded 2.2%/3.6% figures to the paper. Code flags LFSUR and IF as non-responding readouts and adds the score_reform and compare routes. Paper landing gains status chips, a one-line claim and the section list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e store missed - /economy and /economy/us repeated the store's series list and release calendar (DESIGN.md §7.0 makes /forecasts#data their home). Both hubs now carry one provenance card linking to it; the old #indicators, #markets and #releases anchors land on that card. - Store calendar: missing 'Store id' header fixed (rows had four cells, head three), plus a status column computed from the store's own last fetch: the 13 August GDP release has passed and is not in the store. - Inflation topic said the round 'starts at 2026Q3' over a table that began at 2026Q2; both topic tables now start at the first quarter without an outturn. - Growth topic said rounds are scored 'against the vintage it was made on'; scoring uses the outturn as published, with its snapshot recorded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…unnable code Overview gains a registry-sourced model card and shows all six 2026Q1 shock probabilities from latest_shocks.json (it showed four). The incidence worked example keeps its mechanism but drops the 0.94pp and £0.09bn figures, which have no committed artifact (only a commit message). The sources table moves from the Overview expander to Methodology, replacing a card that only pointed back at it. Validation keeps the satellite's skill result and links its specification, and folds the cited OBR/external forecaster table into the diagnostics expander. Code adds the missing step-1 panel, the fourth hosted tool, draw/runtime guidance and a Python route. Paper landing states the claim in words, keeps the current-forecast window, and lists the sections. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Overview of frb-us, us-hank, olg and define opens on a model card (answers, horizon, inputs, outputs, join, cannot answer, access, runtime, vintage, uncertainty) copied from capabilities.py MODELS, with the verdict. - Validation tabs gain a trust card: the six MODEL_QUALITY levels and what would change each, never shown on the site before. - Each fact once: the FRB/US 100bp response and multipliers live on Validation; Methodology and the paper ledes link instead of restating. - FRB/US worked-shock comparators corrected to the paper's comparison table (no published GDP figure; core inflation vs about -0.08pp); the two multiplier cells only the paper carried are added; duplicate id fixed; the core PCE miss moves into the limits table. - OLG: cohort ages corrected to 20-99 (papers/psl-og); the five structural limits and the og+microsim overlay limits move into the limits table; showcase table emits U+2212. - DEFINE: one h1 across tabs, a full limits table, duplicates trimmed. - Eyebrows carry id, country, access and horizon; report kickers drop ordinals; HANK Code lists all three MCP tools. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The page carried the pre-12-Aug run (751, 7.5%, ESS 355.9). boe-var-model results/summary.md on main (845e2a4, seed 20260812, since 42cbcbb) and this repo's own papers/boe-svar implementation.tex and appendix.tex give 744 of 10,000, 7.4%, ESS 356.1. The prose now links the summary. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ing endpoints validation/check_obr_tables.py recomputes the anchored levels table, the fit ranges, both mean absolute deviations (0.30%, 0.49%), the free-running 694.4 -> 679.0 path, its 4.32% MAD and the ~50bn gap from papers/obr-macro/figures/fig_anchored_data.csv and fig_free_running_data.csv. All match; no number changes. tests/test_obr_tables.py runs it; the figure caption cites it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
canaries.json pinned quoted_at to page:line. Merging the stack (#204, #206, #205, #219 into #200 before or after this PR) moves those lines, so seven test_quoted_at_points_at_a_real_line cases failed on the merged tree though every quote was still on its page. quoted_at now names the page; the line is located from quoted_anchor at report time, and the test requires the anchor exactly once on the page, so editing the quoted number still forces the canary to be revisited. No expected values changed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge plan for the round 5 stack into #200 (checked 6 Nov 2026)Tips tested: #200 git fetch origin && git worktree add --detach /tmp/r5sim origin/vahid/redesign-r2-integrate && cd /tmp/r5sim
for b in r5-ui-home r5-ui-models r5-ui-data r5-compare r5-api-scenarios r5-obr-pin r5-drift-check; do
git merge --no-ff --no-edit origin/vahid/$b || { echo "conflict at $b"; break; }; done
PYTHONPATH=integration/src python3 -m pytest -q tests integration/tests && python3 site_contract.py && python3 site_nav.py
cd - && git worktree remove --force /tmp/r5simRules
Order and commandsR=PolicyEngine/macro; B=vahid/redesign-r2-integrate
gh pr ready 204 -R $R && gh pr merge 204 -R $R --merge # r5-ui-home
gh pr ready 206 -R $R && gh pr merge 206 -R $R --merge # r5-ui-models
gh pr ready 205 -R $R && gh pr merge 205 -R $R --merge # r5-ui-data
gh pr edit 219 -R $R --base $B # was vahid/r5-ui-home
gh pr ready 219 -R $R && gh pr merge 219 -R $R --merge # r5-compare
gh pr ready 216 -R $R && gh pr merge 216 -R $R --merge # r5-api-scenarios
# --- only if you choose option 1 on #218 (bump the OBR pin) ---
gh pr edit 226 -R $R --base $B # was vahid/r5-api-scenarios
gh pr ready 226 -R $R && gh pr merge 226 -R $R --merge # r5-obr-pin
gh pr edit 229 -R $R --base $B # was vahid/r5-obr-pin
gh pr ready 229 -R $R && gh pr merge 229 -R $R --merge # r5-drift-check
# --- then the redesign itself ---
gh pr ready 200 -R $R && gh pr merge 200 -R $R --merge # into mainIn the GitHub UI, the same steps are: "Ready for review", then "Create a merge commit", in this order. For #219, #226 and #229, first click "Edit" next to the title and change the base to The UI group (#204, #206, #205, #219) and the integration group (#216, #226, #229) do not touch each other's lines. I merged them in both orders (UI first, then integration first) and got byte-identical trees. #221 and #228 form a separate chain onto main. They still merge cleanly after #200 lands. If you choose option 2 on #218 (wait): leave #226 and #229 unmerged. #229 is built on #226, so it carries the pin bump. You can merge #200 without them. Checks on the final tree (base + 204 + 206 + 205 + 219 + 216 + 226 + 229, merge commits)
Fixes made at the source (no hand resolution)
Follow-ups and decisions, by PR
|
Combined merge order with the pipeline PRs (#221, #228, #195): simulated 6 NovRecommendation: merge this stack first if it can land by about 11 Nov. Then #221 → token/setting (#223) → #228 recovery → dispatch fetch-vintages (it rebuilds #195 from the new main) → close/reopen #195 for CI → merge #195 before the 12 Nov GDP release. If #200 can't land by then, keep the pipeline-first order and rebase this PR using the steps below. What I simulated (local scratch worktrees; nothing pushed or merged): both orders, at tips #204
This stack first. #221 and #228 merge clean on top. refresh.py already calls this PR's generator ( Pipeline first (fallback): rebase this PR. 16 conflicting files, all generated:
Pre-emptive commits: one, #229 Full notes: |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…stacks Both stacks add entries; a shared heading with a separator line lets them merge in either order without a CHANGELOG.md conflict. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merges the shared [Unreleased] anchor (84e9539) and lists every redesign-stack PR's bullets here, by PR number. The stacked PRs no longer edit CHANGELOG.md, so they stop conflicting with each other, and the pipeline stack (#221, #228) adds its entries below the separator line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
This PR redesigns the whole site in the style of the Autumn Budget 2026 and tourism dashboards: a dark teal header band with four views, a teal title band on every page, a sticky white sub-tab row, then white cards on a grey canvas. Each card has a short title, a one-line lede, the figure or table, and the long explanation behind an expander. The two-sided step panel (numbered steps on the left, sticky figures on the right) remains the main layout for model Overview, Methodology, Validation and Code tabs.
DESIGN.mdis the binding spec. URLs, numbers and data are unchanged; generated pages were changed through their generators and regenerated.By page type
--nav-h. The stylesheet cache buster is now 10.site_nav.SUBTABS./stepper.jsreplaces the inline copies.chartkit.py), so they render at 12 px at any width. Ours is solid, the official series is dashed, legends are in HTML, and zero lines are drawn./forecasts.--rebuild./connectis an MCP → CLI → Python step panel./contactis a single card.Phase 4 (QA) changes
/forecastsmoved, unchanged, into an About expander. Ledes over 40 words were cut to the limit with every caveat kept:/economy,/economy/us,/forecasts/usand the DEFINE-UK replication report. The/economy/us"no US forecast" note moved from the title band into an intro card. Topic ledes keep proper nouns ("official Bank Rate", "UK nominal par yield") instead of lower-casing them. On/economyand/economy/us, the meta paragraph at the top of the topics card ("The rest of this site is organised by model…") was replaced by one sentence. It held no caveat or number, so it was removed rather than hidden./forecasts#limitssaid Bank Rate was "the only robust win".papers/boe-svar/figures/rolling_evaluation.jsoncontradicts that. Against a drifting random walk, Bank Rate scores 0.793 at h=1 with DM p=0.018. Its Benjamini–Hochberg q is 0.362, and none of the 64 variable × horizon tests reaches q < 0.10 (minimum q is 0.362, or 0.401 on the production spec). The sentence now says Bank Rate comes closest and no gain survives correction for the number of tests run. It links to/svar/validation#forecastersand does not restate the figures./modelsand/connectmark their first sub-tab before the first section is reached./notes/releasesgained its "where next" row. The OBR paper lede names the March 2026 EFO baseline again.Round 2 (tab-by-tab economist and designer review, five areas)
/modelsis a router.vercel.jsonto its digest anchor.Round 3 (layout and density)
/modelscomparison table is transposed to five columns.Screenshots (before → after)
Full-page shots at 1440 and 375 px were taken for home,
/obr,/obr/validation,/models,/forecasts,/economy, a release digest and/svar/validation, before (origin/main) and after (this branch). They were reviewed locally and are not attached. What changes, page by page:/obr). Before: slogan h1, 100–150-word paragraphs, a step panel whose right side was empty after step 1. After: model name h1, a model card, short steps with a figure per step, detail in expanders./obr/validation,/svar/validation). After: a stat row as the home of each headline number, the tests as rows, a limits card that keeps every failure statement./models. Before: an eight-column comparison table clipped at 1440. After: five columns, models as rows./forecasts. After: the scoreboard is the full-width lead card; limits are label/value rows.Content flags (published record or wording that changed, beyond layout)
/forecasts(it was never scored before). It falls outside the archived 90% band, with a smaller error than no change.papers/boe-svar/figures/rolling_evaluation.json).papers/frb-us/sections/comparison.tex(no published GDP figure; core inflation −0.034pp vs ≈−0.08pp). The Methodology claim that both multipliers sit inside published ranges was removed (the pegged year-2 0.90 is below 1.1–1.2).papers/psl-og/sections/calibration.tex)./models#score: "GDP −0.02% on impact building to −0.06%" deleted (see decision 1).Not in this PR, for Vahid: data PR #195 has been open since 27 Aug and adds 20 per-series notes from the old generator, which conflicts with the digests;
fetch-vintages.ymlnever runs ingest or score, so the record stays stalled at 26 Aug.Round 5: correctness pass from the 5 Nov model-repo reviews
Each change cites its repo source in the commit message. Numbers changed (old → new):
/frb-us/validationlimitsbacktests/longbase_vs_outturns.md, fix in PolicyEngine/us-frb-model#10 (LONGBASE now compounded like the outturn)/frb-us/validationlimits/svar/validationcoverageresults/coverage_evaluation.jsonproduction_spec/olgshowcase/obr/validationtiletests/test_model_invariants.py:910-962Wording withdrawn or corrected (no number changed):
/define/validation, the replication report and the paper (calibration.tex,limitations.tex, PDF rebuilt). In the cached run social benefits rise (+8.0 of 118.2), so the bias direction is not established. The withdrawn IMF 1.1–1.5 band is gone from the methodology diagram and the kv rows, and the label "DEFINE-UK 1.78" now reads "1.78, to 2040 (our computation)". Source: Correct the multiplier caveat, state units, gate stock-flow consistency, and sweep every cached scenario define-uk-model#15.OAHHxis described as an asset stock, not "other income". Source: Fix lagged ONS formulas, employment seed units and out-of-window shocks; correct the profits explanation obr-macroeconomic-model#48.make_charts.py, regenerated).hank_summaryframing and MCP docstrings) says that only the steady state is validated and IRF magnitudes are not. "Realistic distribution" and "response concentrating among high-MPC households" now say the distribution is calibrated (about 54% hand-to-mouth vs about one third in US data) and that the by-wealth split is an MPC-proportional allocation. Source: Review fixes, scenario sweep tests, pinned G-shock and MPC figures us-hank-model#4 README.Backend:
obr_shockpassesend= max(2027Q4, last shocked quarter) torun_reform, and the periods cap goes 40 → 25 (the databank ends 2031Q1). Before this,periods=20reported a 12-quarter cumulative as a 20-quarter one. The new tests fail on the oldcore.py. No real solve past 2027Q4 was run locally.Decisions for Vahid
/models#score. We deleted "GDP −0.02% on impact building to −0.06%". It is a per-quarter percentage and conflicts with the ratio framing on/obr/validation. Restore it with a units note, or leave it out?Kept duplicates.
/obr#answers,/obr/validation,/pe/validationand the pe chart.Keep these, or reduce each to one home?
Word-valued stat tiles. The olg, us-hank and define tiles hold words ("none", "anchors", "1 row"). Keep them as tiles, or turn them into callouts?
Same forecast twice. The hero fan on the home page and the boe-svar Overview outlook chart plot the same forecast. Keep both, or replace one with a link?
/economytrend figures. They no longer show the latest value, which now lives on the topic pages. Is that acceptable?DEFINE diagram label. Resolved in round 5: the label now reads "1.78, to 2040 (our computation)" and the withdrawn IMF band is gone.
Site-contract test change. In
test_site_contract.py, themin-height: 112pxassertion was replaced. It pinned the two-row mobile header from Fix platform audit findings #70, which the single--nav-hband replaces (DESIGN §2.4, §3.1). The test now checks the same intent on the new shell:--nav-h;Is that acceptable as the new contract?
Method diagrams. On a phone they use a native-width scroller with a fade instead of the chartkit HTML-label overlay. Converting them to the overlay is a larger rewrite of 40 hand-drawn SVGs. Accept the scroller, or schedule the rewrite?
Table stacking needs JS.
reveal.jsdecides which tables become cards on a phone, using a word-heavy heuristic with adata-stackoverride. Without JS every table scrolls. Accept, or writedata-labelinto the markup and generators instead?Paper and report landings restate Validation figures. The
/papers/boe-svarresult paragraph repeats 0.32pp and the smallest adjusted q of 0.36./papers/define-ukand/reports/define-uk-replicationrepeat 4.66% and 1.78. These are each paper's own summary, so they were left alone. Keep them, or link to Validation?Step-panel spacing. Each step is at least 70vh tall so the sticky panel can follow along. This leaves a large blank stretch after short steps, for example after step 2 of "How the models connect" on the home page. Keep it, or lower it to around 55vh?
Home lede. The home intro-card lede is 47 words and links all seven models. §7.1 treats it as an intro card rather than a title band, so the 40-word limit was not applied. Trim it?
/contact. It has no "where next" row because §7.9 says "nothing else". Confirm.Tests
PYTHONPATH=integration/src python3 -m pytest tests integration/tests -q: 1467 passed, 101 skipped (round 5).tests+test_site_contract.pyalone: 1172 passed, 19 skipped (the count fell from 1564 when 53 release notes became 8 digests;tests/test_site_integrity.pyis parametrized per page, 1000 → 595 cases). Its discovery floortest_the_suite_actually_found_the_sitewas lowered from 70 to 60 pages to match.python3 site_contract.pyandpython3 site_nav.pypass.--checkpasses:economy/build.py,economy/topics.py,notes/generate_release_notes.py,forecasts/{make_us_baseline,ingest_outturns,archive,make_open_fans,score}.py,data/build_page.py,data/fetch.py,assets/make_hero.py,assets/make_current_outlooks.py,olg/figures/make_showcase.py,validation/figures/make_charts.py.vercel.jsonredirects, cleanUrls and#fragmentids, found no broken links./obr/validation,/forecastsand a topic page;reveal.jskeeps its?v=2query string, which is hard-coded on the pages. A cached copy only means tables scroll and rows don't fade.🤖 Generated with Claude Code